Aller au contenu principal

Cours - SSH et notions de cryptographie

Principe, vocabulaire

Protéger des messages (confidentialité, authenticité, intégrité) en s’aidant souvent de secrets ou clés.

  • Confidentialité : seul l'expéditeur et le destinaire ont accès au message
  • Authenticité : le message reçu par le destinaire provient bien de l'expéditeur
  • Intégrité : le message reçu est complet et n'a pas été déformé

chiffrement symétrique

Historique : le nombre de César

  • un algoritme : décalage des lettres dans l'alphabet
  • un secret / une clef (par exemple : 3)
  • pour déchiffrer : opération inverse triviale
Linux c'est sympatoche
Olqxa f'hvw vbpsdwrfkh

Pas d'équivalent classique ...

  • imaginer un sorte de nombre de César où l'on chiffre en décalant de 3 ...
  • ... mais pour déchiffrer, il faut faire -12 !

Les mathématiques permettent de générer un couple de clef (A, B) :

  • chiffrer(message, A) peut être déchiffré uniquement avec B

  • chiffrer(message, B) peut être déchiffŕe uniquement avec A

  • On nomme une clef la clef privée : on la garde secrètement rien que pour nous

  • On nomme l'autre la clef publique : on la donne à tout le monde

  • Si quelqu'un cherche à vous envoyer un message, ils chiffrent en utilisant votre clef publique

  • Vous seul avez la clef privée et pouvez déchiffrer.

  • Le chiffrement asymétrique assure la confidentialité et l'integrité
  • Mais pas l'authenticité !
  • Besoin d'un mécanisme de "signature"

Echange de clef

  • Vous recevez un mail de Edward Snowden avec sa clef publique en copie
  • Comment s'assurer que c'est la vraie bonne clef ?
  • (Spoiler alert : vous ne pouvez apriori pas...)

Problème général de sécurité : il est difficile de s'assurer de l'authenticité initiale de la clef publique

Solution 1 : la vraie vie

Voir Edward Snowden en chair et en os, et récupérer la clef avec lui

Solution 2 : web of trust

La clef de Edward Snowden a été signé par pleins de journalistes et activitstes indépendant à travers le monde, ce qui diminue le risque d'une falsification

Solution 3 : autorités de certification

Vous faites confiance à Microsoft et Google (!?), qui certifient avoir vérifié que E. Snowden possède cette clef.

  • C'est le principe des autorités de certification utilisé par HTTPS
  • Votre navigateur fait confiance à des clefs prédéfinies correspondant à des tiers de "confiance" (e.g. Google, ...)
  • Le certificat HTTPS contient une signature qui a été produite avec l'une des clefs de ces tiers de confiance
  • Vous pouvez ainsi faire confiance "par délégation"

Applications

  • HTTPS (SSL/TLS, x509)
  • SSH
  • Emails chiffrés
  • Signature des paquets dans APT
  • ...

Se connecter et gérer un serveur avec SSH

À propos des serveurs

Serveur (au sens matériel)

  • machine destinée à fournir des services (e.g. un site web)
  • allumée et connectée 24/7
  • typiquement sans interface graphique
  • ... et donc administrée à distance

Serveur (au sens logiciel)

  • aussi appelé "daemon", ou service
  • programme qui écoute en permanence et attends qu'un autre programme le contacte
    • par ex. : un serveur web attends des clients
  • écoute typiquement sur un ou plusieurs port
    • par ex. : 80 pour HTTP

Serveurs : quel support matériel ?

... Plot twist !

"Virtual" Private Server (VPS)

VPS = une VM dans un datacenter

... qui tourne quelque part sur une vraie machine

SSH : Secure Shell

  • Un protocole client-serveur, par défaut sur le port 22
  • Prendre le contrôle d'une machine à distance via un shell
  • Sécurisé grâce à du chiffrement asymétrique
    • le serveur a un jeu de clef publique/privé
    • le client peut aussi en avoir un (sinon : mot de passe)
  • Outil "de base" pour administrer des serveurs

Syntaxe : ssh utilisateur@machine

$ ssh admin@ynh-forge.netlib.re
The authenticity of host 'ynh-forge.netlib.re (46.101.221.117)' can't be established.
RSA key fingerprint is SHA256:CuPd7AtmqS0UE6DwDDG68hQ+qIT2tQqZqm8pfo2oBE8.
Are you sure you want to continue connecting (yes/no)? █
$ ssh admin@ynh-forge.netlib.re
The authenticity of host 'ynh-forge.netlib.re (46.101.221.117)' can't be established.
RSA key fingerprint is SHA256:CuPd7AtmqS0UE6DwDDG68hQ+qIT2tQqZqm8pfo2oBE8.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'ynh-forge.netlib.re' (RSA) to the list of known hosts.
Debian GNU/Linux 9
admin@ynh-forge.netlib.re's password: █
$ ssh admin@ynh-forge.netlib.re
The authenticity of host 'ynh-forge.netlib.re (46.101.221.117)' can't be established.
RSA key fingerprint is SHA256:CuPd7AtmqS0UE6DwDDG68hQ+qIT2tQqZqm8pfo2oBE8.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'ynh-forge.netlib.re' (RSA) to the list of known hosts.
Debian GNU/Linux 9
admin@ynh-forge.netlib.re's password:

Last login: Thu Oct 4 08:52:07 2018 from 90.63.229.46
admin@ynh-forge:~$ █

SSH : se logguer

  • ACHTUNG : Soyez attentif à dans quel terminal vous tapez !!!
  • En se connectant la première fois, on vérifie la clef publique du serveur
  • On a besoin du mot de passe pour se connecter
  • ... mais la bonne pratique est d'utiliser nous-aussi une clef

SSH : avec une clef

... mais pourquoi ?

  • Pas de mot de passe qui se balade sur le réseau
  • Pas nécessaire de retaper le mot de passe à chaque fois
  • Possibilité d'automatiser des tâches (clef sans mot de passe)
  • (Plusieurs personnes peuvent avoir accès à un meme utilisateur sans devoir se mettre d'accord sur un mot de passe commun)

1 - Générer avec ssh-keygen -t rsa -b 4096 -C "commentaire ou description"

$ ssh-keygen -t rsa -b 4096 -C "Clef pour la formation"
Generating public/private rsa key pair.
Enter file in which to save the key (/home/alex/.ssh/id_rsa):
Enter passphrase (empty for no passphrase): # Mot de passe
Enter same passphrase again: # (again)
Your identification has been saved in /home/alex/.ssh/id_rsa.
Your public key has been saved in /home/alex/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:ZcAKHVtTXUPz3ipqia4i+soRHZQ4tYsDGfc5ieEGWcY "Clef pour la formation"

2 - Configurer la clef sur le serveur

  • soit depuis le client avec
ssh-copy-id -i chemin/vers/la/clef user@machine
  • soit depuis le serveur en rajoutant la clef dans ~/.ssh/authorized_keys
    • (generalement, l'admin vous demande votre clef)

3 - Utiliser la clef pour se connecter

$ ssh -i ~/.ssh/ma_clef alex@jaimelecafe.com
Enter passphrase for key '/home/alex/.ssh/ma_clef':

Last login: Mon Oct 8 19:46:32 2018 from 11.22.33.44
user@jaimelecafe.com:~$ █
  • Le système peut potentiellement se souvenir du mot de passe pour les prochaines minutes, comme avec sudo
  • Il peut ne pas y avoir de mot de passe (utilisation dans des scripts)

SSH : configuration côté client

  • Le fichier ~/.ssh/config peut être édité pour définir des machines et les options associées
Host jaimelecafe
User alex
Hostname jaimelecafe.com
IdentityFile ~/.ssh/ma_clef
  • On peut ensuite écrire simplement : ssh jaimelecafe

SCP : copier des fichiers

scp <source> <destination> permet de copier des fichiers entre le client et le serveur

  • Le chemin d'un fichier distant s'écrit machine:/chemin/vers/fichier
  • ou (avec un user) : utilisateur@une.machine.com:/chemin/vers/ficier

Exemples :

$ scp slides.html bob@dismorphia.info:/home/alex/
$ scp bob@dismorphia.info:/home/alex/.bashrc ./

Divers

  • Client SSH sous Windows : MobaXterm
  • sshfs pour monter des dossiers distants
  • ssh -D pour créer des tunnels chiffrés (similaires à des VPNs)